import json

import os
from gtts import gTTS
from pydub import AudioSegment


def change_speed(sound, speed=1.0):
    """
    修改音频的播放速度。

    :param sound: pydub AudioSegment 对象
    :param speed: 速度因子（>1.0加快，<1.0减慢）
    :return: 修改速度后的 AudioSegment 对象
    """
    sound_with_speed = sound._spawn(sound.raw_data, overrides={
        "frame_rate": int(sound.frame_rate * speed)
    })
    return sound_with_speed.set_frame_rate(sound.frame_rate)


def change_pitch(sound, semitones):
    """
    改变音频的音高。

    :param sound: pydub AudioSegment 对象
    :param semitones: 要改变的半音数量，正数升高音调，负数降低音调。
    :return: 改变音高后的 AudioSegment 对象
    """
    new_sample_rate = int(sound.frame_rate * (2.0 ** (semitones / 12.0)))
    pitch_shifted_sound = sound._spawn(sound.raw_data, overrides={'frame_rate': new_sample_rate})
    return pitch_shifted_sound.set_frame_rate(sound.frame_rate)


def text_to_speech_lang(text, output_file, is_chinese=True):
    # 中文用这个
    if is_chinese:
        text_to_speech_with_pitch_and_speed(text, output_file, 1.2, 1)
    else:
        text_to_speech_with_pitch_and_speed(text, output_file, 1, 0, lang='en')


def text_to_speech_with_pitch_and_speed(text, output_file, speed=1.0, semitones=0, lang='zh'):
    """
    将文本转换为语音，并调整语速和音高，保存为MP3文件。

    :param text: 要转换的中文文本
    :param output_file: 输出的MP3文件路径
    :param speed: 语速调整因子（>1.0加快，<1.0减慢）
    :param semitones: 音高调整的半音数量，负数降低音高，正数升高音高。
    """
    # 创建 gTTS 对象，设置语言为中文
    tts = gTTS(text=text, lang=lang, slow=False)

    # 保存为临时的MP3文件
    temp_file = "temp.mp3"
    tts.save(temp_file)

    # 使用 pydub 处理 MP3 文件
    audio = AudioSegment.from_mp3(temp_file)

    # 调整语速
    if speed != 1.0:
        audio = change_speed(audio, speed)

    # 调整音高
    if semitones != 0:
        audio = change_pitch(audio, semitones)

    # 保存最终的 MP3 文件
    audio.export(output_file, format="mp3")

    # 删除临时文件
    if os.path.exists(temp_file):
        os.remove(temp_file)
